package com.iamteer.day20;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
主要回顾：InputStream
IO 流分类：
	按数据的流向：
		输入流：
		输出流：
		
	按处理的单位：
		字节流：字节流读取到的都是文件的二进制数据
		字符流：读取数据是以字符为单位（读取到的也是二进制数据，转成也字符）
			字符流 = 字节流 + 解码
			
输入字节流：
--------| InputStream	所有输入字节流的基类（抽象类）
------------| FileInputStream	读取文件数据的输入字节流


 */
public class InputStream {

	public static void main(String[] args) throws IOException {
//		readTest1();
//		readTest2();
//		readTest3();
		readTest4();
	}
	
	//单字节读取
	public static void readTest1() throws IOException {
//		File file = new File("../../");
//		File[] files = file.listFiles();
//		for (File item : files) {
//			System.out.println(item);
//		}
		
		//1. 找到目标文件
		File file = new File("../../test.txt");
		//2. 建立数据的输入通道
		FileInputStream fileInputStream = new FileInputStream(file);
		//3. 读取文件中的数据
		int content = -1;
		content = fileInputStream.read();	//read 每次读取一个字节
		//4. 处理数据
		System.out.print((char)content);	
		//5. 关闭数据通道
		fileInputStream.close();
	}
	
	//循环读取
	public static void readTest2() throws IOException {
		long startTime = System.currentTimeMillis();
		//1. 找到目标文件
		File file = new File("../../test.jpg");
		//2. 建立数据通道
		FileInputStream fileInputStream = new FileInputStream(file);
		//3. 读取文件中的数据
		int content = -1;
		while ((content = fileInputStream.read()) != -1) {
			System.out.print((char)content);	//4. 处理数据
		}
		//5. 关闭资源，否则其他程序无法对该资源进行操作
		fileInputStream.close();
		long endTime = System.currentTimeMillis();
		System.out.println("Time: " + (endTime-startTime));
	}
	
	//使用缓冲数组读取
	public static void readTest3() throws IOException {
		//1. 找到目标文件
		File file = new File("../../test.txt");
		//2. 建立数据通道
		FileInputStream fileInputStream = new FileInputStream(file);
		//3. 读取文件数据
		byte[] buf = new byte[4];
		int length = fileInputStream.read(buf);
//		System.out.println(length);
		//4. 处理文件数据
		String content = new String(buf, 0, length);	//使用字节数组构建字符串
		System.out.println(content);
		//5. 关闭文件资源，否则其他程序无法对该资源进行操作
		fileInputStream.close();
	}
	
	//使用缓冲数组读取配合循环
	public static void readTest4() throws IOException {
		long startTime = System.currentTimeMillis();
		//1. 找到目标文件
		File file = new File("../../test.jpg");
		//2. 建立数据通道
		FileInputStream fileInputStream = new FileInputStream(file);
		//3. 读取文件数据
		int length = 0;	//
		byte[] buf = new byte[1024];
		while ((length = fileInputStream.read(buf)) != -1) {	//覆盖式读取（不清空数组）
			//4. 处理文件数据
			System.out.print(new String(buf, 0, length));
		}
		//5. 关闭文件资源，否则其他程序无法对该资源进行操作
		fileInputStream.close();
		long endTime = System.currentTimeMillis();
		System.out.println("Time: " + (endTime-startTime));
	}
}
